    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.catosist.run.business.gestorviaje;

import com.catosist.run.dataaccess.domain.ViajeDao;
import com.catosist.run.dataaccess.model.PersonaVO;
import com.catosist.run.dataaccess.model.RutaVO;
import com.catosist.run.dataaccess.model.VehiculoVO;
import com.catosist.run.dataaccess.model.ViajeVO;
import com.catosist.run.services.ViajeDTO;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.hibernate.exception.SQLGrammarException;

/**
 *
 * @author Bicho
 */
public class GestorViajeImpl implements GestorViaje {

    public GestorViajeImpl() {
    }

    @Override
    public List<ViajeDTO> getAll() {
//        if (viajeVOs == null) {
//            viajeVOs = viajeDao.getAll();
//        }
        List<ViajeVO> viajeVOs = viajeDao.getAll();
        List<ViajeDTO> viajeDTOs = new LinkedList<ViajeDTO>();
        try {
            for (Iterator<ViajeVO> it = viajeVOs.iterator(); it.hasNext();) {
                ViajeVO viajeVO = it.next();
                System.out.println("viajeID: " + viajeVO.getId());
                System.out.println("viajeID: " + viajeVO.getRuta().getDescripcion());
                System.out.println("viajeID: " + viajeVO.getPersona().getNombre());
                System.out.println("viajeID: " + viajeVO.getVehiculo().getPlaca());
                System.out.println("viajeID: " + viajeVO.getFingreso().toString());
                ViajeDTO viajeDTO = new ViajeDTO(viajeVO.getId(),
                        viajeVO.getRuta().getDescripcion(),
                        viajeVO.getPersona().getNombre() + " " + viajeVO.getPersona().getAppaterno(),
                        viajeVO.getVehiculo().getPlaca(),
                        viajeVO.getFingreso(),
                        viajeVO.getRuta().getDescripcion(),
                        viajeVO.getVehiculo().getPlaca());

                viajeDTO.setRutaid(viajeVO.getRuta().getId());
                viajeDTO.setVehiculoId(viajeVO.getVehiculo().getId());
                viajeDTO.setPersonaId(viajeVO.getPersona().getId());
                viajeDTO.setTotalgasto(viajeVO.getTotalgasto());

                viajeDTOs.add(viajeDTO);
            }
        } catch (SQLGrammarException ex) {
            System.out.println("Exception GestorViaje: " + ex.getMessage());
        }
        return viajeDTOs;
    }

    @Override
    public ViajeDTO getByIndex(int indice) {
        updateListVo();
        ViajeVO viajeVO = this.viajeVOs.get(indice);
        ViajeDTO tmp = new ViajeDTO(viajeVO.getId(), viajeVO.getRuta().getDescripcion(),
                viajeVO.getPersona().getNombre() + " " + viajeVO.getPersona().getAppaterno(),
                viajeVO.getVehiculo().getPlaca());
        tmp.setFingreso(viajeVO.getFingreso());
        tmp.setRutaid(viajeVO.getRuta().getId());
        tmp.setVehiculoId(viajeVO.getVehiculo().getId());
        tmp.setPersonaId(viajeVO.getPersona().getId());
        tmp.setAdelanto(viajeVO.getTotaladelanto());
        tmp.setTotalgasto(viajeVO.getTotalgasto());
        tmp.setRuta(viajeVO.getRuta().getDescripcion());
        tmp.setPlacaVehiculo(viajeVO.getVehiculo().getPlaca());
        return tmp;
    }

    @Override
    public ViajeDTO getById(int voId) {
        ViajeVO viajeVO = null;
        for (Iterator<ViajeVO> it = viajeVOs.iterator(); it.hasNext();) {
            ViajeVO viajeVO1 = it.next();
            if (viajeVO1.getId() == voId) {
                viajeVO = viajeVO1;
            }
        }
        ViajeDTO tmp = new ViajeDTO(viajeVO.getId(), viajeVO.getRuta().getDescripcion(),
                viajeVO.getPersona().getNombre() + " " + viajeVO.getPersona().getAppaterno()
                , viajeVO.getVehiculo().getPlaca());
        tmp.setFingreso(viajeVO.getFingreso());
        tmp.setRutaid(viajeVO.getRuta().getId());
        tmp.setVehiculoId(viajeVO.getVehiculo().getId());
        tmp.setPersonaId(viajeVO.getPersona().getId());
        tmp.setAdelanto(viajeVO.getTotaladelanto());
        tmp.setTotalgasto(viajeVO.getTotalgasto());
        tmp.setRuta(viajeVO.getRuta().getDescripcion());
        tmp.setPlacaVehiculo(viajeVO.getVehiculo().getPlaca());
        
        return tmp;
    }

    private ViajeVO getByIndice(int indice) {
        return this.viajeVOs.get(indice);
    }

    public ViajeVO getVOatIndex(int indice) {
        return this.viajeVOs.get(indice);

    }

    @Override
    public void deleteById(int id) {
        viajeDao.deleteById(id);
        updateListVo();
    }

    @Override
    public int getIdAtIndex(int indice) {
        return this.viajeVOs.get(indice).getId();
    }

    @Override
    public void saveOrUpdate(ViajeDTO o) {

        ViajeVO viajeVo = new ViajeVO();

        if (o.getId() != 0) {
            viajeVo.setId(o.getId());
        }

        viajeVo.setFingreso(o.getFingreso());
        System.out.println("Adelnto: "+o.getAdelanto());
        viajeVo.setTotaladelanto(o.getAdelanto());

        PersonaVO personaVO = new PersonaVO();
        personaVO.setId(o.getPersonaId());
        viajeVo.setPersona(personaVO);
        System.out.println("ViajeID: " + o.getPersonaId());

        RutaVO rutaVO = new RutaVO();
        rutaVO.setId(o.getRutaid());
        viajeVo.setRuta(rutaVO);
        System.out.println("RutaID: " + o.getRutaid());

        VehiculoVO vehiculoVO = new VehiculoVO();

        vehiculoVO.setId(o.getVehiculoId());
        viajeVo.setVehiculo(vehiculoVO);
        System.out.println("VehiculoID: " + o.getVehiculoId());

        viajeVo.setTotalgasto(o.getTotalgasto());

        viajeDao.saveOrUpdate(viajeVo);

        viajeVo = viajeDao.get(viajeVo.getId());

//        if (o.getIndex() > 0) {
//            this.viajeVOs.set(o.getIndex(), viajeVo);
//        } else {
//            this.viajeVOs.add(viajeVo);
//        }
        this.updateListVo();
    }

    public void saveOrUpdate(ViajeDTO o, int viajeId) {

        ViajeVO viajeVo = new ViajeVO();

        viajeVo.setId(viajeId);

        viajeVo.setFingreso(o.getFingreso());
        viajeVo.setTotaladelanto(o.getAdelanto());

        PersonaVO personaVO = new PersonaVO();
        personaVO.setId(o.getPersonaId());
        viajeVo.setPersona(personaVO);
        System.out.println("ViajeID: " + o.getPersonaId());

        RutaVO rutaVO = new RutaVO();
        rutaVO.setId(o.getRutaid());
        viajeVo.setRuta(rutaVO);
        System.out.println("RutaID: " + o.getRutaid());

        VehiculoVO vehiculoVO = new VehiculoVO();

        vehiculoVO.setId(o.getVehiculoId());
        viajeVo.setVehiculo(vehiculoVO);
        System.out.println("VehiculoID: " + o.getVehiculoId());

        viajeVo.setTotalgasto(o.getTotalgasto());

        viajeDao.saveOrUpdate(viajeVo);

        viajeVo = viajeDao.get(viajeVo.getId());

//        if (o.getIndex() > 0) {
//            this.viajeVOs.set(o.getIndex(), viajeVo);
//        } else {
//            this.viajeVOs.add(viajeVo);
//        }
        this.updateListVo();
    }

    public ViajeDao getViajeDao() {
        return viajeDao;
    }

    public void setViajeDao(ViajeDao viajeDao) {
        this.viajeDao = viajeDao;
    }
//    private ApplicationContext ctx;
    private ViajeDao viajeDao;
    private List<ViajeVO> viajeVOs;// = new LinkedList<ViajeDTO>();

    @Override
    public void updateListVo() {
        viajeVOs = viajeDao.getAll();

    }

    public int getIndexOf(int voId) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deleteByIndex(int index) {
//        this.viajeVOs.remove(index);
        ViajeVO viajeVO = viajeVOs.get(index);
        viajeDao.delete(viajeVO);
        this.updateListVo();
    }

    public List<ViajeDTO> getAllOrderByDate() {
//        if (viajeVOs == null) {
        viajeVOs = viajeDao.getAllOrderByDate();
//        }
        List<ViajeDTO> viajeDTOs = new LinkedList<ViajeDTO>();
        try {
            for (Iterator<ViajeVO> it = viajeVOs.iterator(); it.hasNext();) {
                ViajeVO viajeVO = it.next();
                ViajeDTO viajeDTO = new ViajeDTO(viajeVO.getId(),
                        viajeVO.getRuta().getDescripcion(),
                        viajeVO.getPersona().getNombre() + " " + viajeVO.getPersona().getAppaterno(),
                        viajeVO.getVehiculo().getPlaca(),
                        viajeVO.getFingreso(),
                        viajeVO.getRuta().getDescripcion(),
                        viajeVO.getVehiculo().getPlaca());

                viajeDTO.setRutaid(viajeVO.getRuta().getId());
                viajeDTO.setVehiculoId(viajeVO.getVehiculo().getId());
                viajeDTO.setPersonaId(viajeVO.getPersona().getId());
                viajeDTO.setTotalgasto(viajeVO.getTotalgasto());

                viajeDTOs.add(viajeDTO);
            }
        } catch (SQLGrammarException ex) {
            System.out.println("Exception GestorViaje: " + ex.getMessage());
        }
        return viajeDTOs;
    }
}
